package com.example.springbolgdemo.common.advice;

import com.example.springbolgdemo.common.exception.BlogException;
import com.example.springbolgdemo.pojo.response.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.method.annotation.HandlerMethodValidationException;

import java.util.ArrayList;
import java.util.List;

@Slf4j
@ResponseBody
@ControllerAdvice
public class ExceptionAdvice {

    /**
     * 最顶层的异常处理
     * @param e
     * @return
     */
    @ExceptionHandler
    public Result exceptionHandler(Exception e){
    log.error("发生异常,e:",e);
    return Result.fail(e.getMessage());
    }

    /**
     * 对于项目自定义异常处理
     * @param e
     * @return
     */
    @ExceptionHandler
    public Result exceptionHandler(BlogException e){
        log.error("发生异常,e:",e.getErrMsg());
        return Result.fail(e.getErrMsg());
    }

    /**
     * 处理BlogInfoController.getBlogDetail()参数中的@NotNull抛出的参数校验异常
     * @param e
     * @return
     */
    @ExceptionHandler
    public Result exceptionHandler(HandlerMethodValidationException e){
        log.error("发生异常",e);
        List<String> errors = new ArrayList<>();
        //通过这个表达式获取到注解中的message异常信息
        e.getAllErrors().forEach(error ->
                errors.add(error.getDefaultMessage()));
        // 将所有错误信息拼接返回
        String errorMessage = String.join("; ", errors);
        return Result.fail("参数校验失败: "+errorMessage);
    }

    /**
     * 处理UserLoginRequest类中@NotBlank@Length抛出的参数校验异常
     * @param e
     * @return
     */
    @ExceptionHandler
    public Result exceptionHandler(MethodArgumentNotValidException e){
        log.error("发生异常e: ",e);
        //获取@NotBlank@Length等注解中的信息
        String defaultMessage = e.getBindingResult().getFieldError().getDefaultMessage();
        return Result.fail(defaultMessage);
    }


}
